import os
from configparser import ConfigParser
# load_dotenv: 从 .env 文件加载环境变量到 os.environ
from dotenv import load_dotenv



# __file__ 是当前脚本文件的路径。
_conf_dir = os.path.dirname(__file__)
# 将目录路径和配置文件名拼接成完整的文件路径
_conf_file = os.path.join(_conf_dir, 'config.ini')

# 继承 ConfigParser 类，添加 as_dict() 方法，将配置内容转换为字典格式。
# self._sections 是 ConfigParser 内部存储配置节的属性，包含了所有配置节及其键值对
class MyParser(ConfigParser):
    def as_dict(self):
        d = dict(self._sections)
        return d


# 读取配置文件的函数

def _get_all_conf():
    # 创建自定义解析器实例 _config。
    _config = MyParser()
    result = {}
    # 检查配置文件是否存在（os.path.isfile()）。
    if os.path.isfile(_conf_file):
        try:
            # 使用 _config.read() 读取配置文件，指定编码为 UTF-8。
            _config.read(_conf_file, encoding='utf-8')
            # 调用 as_dict() 方法将配置转换为字典。
            result = _config.as_dict()
        except OSError:
            # 异常处理：如果读取失败，抛出包含错误信息的 ValueError。
            raise ValueError('Read config file faild:%s' % OSError)
    return result


# 加载配置并提取特定配置项
# 调用 _get_all_conf() 函数获取所有配置
config = _get_all_conf()
# 从配置字典中提取 mysql 和 smtp 两个配置节，分别存储到 mysql_cfg 和 smtp_cfg 变量中。
mysql_cfg = config['mysql']
smtp_cfg = config['smtp']


# 单例模式：确保全局只有一个 EnvConfig 实例。
# __new__ 方法控制实例的创建，首次调用时初始化，后续调用直接返回现有实例。
# _instance 是类变量，所有实例共享
# 封装环境变量
class EnvConfig:
    _instance = None  # 类变量，用于存储单例实例

    def __new__(cls):
        if cls._instance is None:  # 检查是否已存在实例
            cls._instance = super().__new__(cls)  # 创建新实例
            cls._instance.load()  # 初始化配置
        return cls._instance  # 返回唯一实例

    def load(self, env_name="test"):
        env_file = f".env.{env_name}"  # 根据环境名生成文件名（如 .env.dev）

        # 先加载默认配置（可选）
        if os.path.exists(".env"):
            load_dotenv(".env")  # 加载根目录下的 .env 文件

        # 加载特定环境配置（覆盖同名变量）
        if os.path.exists(env_file):
            load_dotenv(env_file, override=True)

        # 将环境变量绑定到实例属性
        self.API_BASE_URL = os.getenv("API_BASE_URL")
        self.AUTH_TOKEN = os.getenv("AUTH_TOKEN")
        self.COOKIE = os.getenv("COOKIE")

# 全局单例
config = EnvConfig()




